package com.bit.cfdi.web.dao.impl;

import java.util.Calendar;
import java.util.List;

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.bit.cfdi.web.dao.ComprobanteConceptoDAO;
import com.bit.cfdi.web.domain.Comprobante;
import com.bit.cfdi.web.domain.ComprobanteConcepto;

@Repository
public class ComprobanteConceptoDAOImpl extends HibernateDaoSupport implements
		ComprobanteConceptoDAO {
	protected Logger log = LogManager.getLogger(this.getClass().getName());

	@Autowired
	public void init(final SessionFactory sessionFactory) {
		setSessionFactory(sessionFactory);
	}

	@SuppressWarnings("unchecked")
	@Override
	@Transactional public List<ComprobanteConcepto> getImportePorConceptoFecha(
			Long idConcepto, Calendar fechaInicio, Calendar fechaFin) throws DataAccessException {
		List<ComprobanteConcepto> comprobanteConceptolist = null;
		try {
			comprobanteConceptolist = getHibernateTemplate()
					.find(" from ComprobanteConcepto as c inner join fetch c.concepto inner join " +
							"fetch c.comprobante where c.concepto.idConcepto=?"
							+ " and ((c.comprobante.numeroParcialidad=0 and c.comprobante.parcialidades=null) or " +
							"c.comprobante.numeroParcialidad=c.comprobante.parcialidades)"
							+  " and (( c.comprobante.fechaTimbrado>?   AND c.comprobante.fechaTimbrado<? )OR" +
							"(c.comprobante.fechaTimbrado is null AND c.comprobante.fechaCreacion>?   AND " +
							"c.comprobante.fechaCreacion<? ))"
							+ " and ( c.comprobante.tipoComprobante = '"+Comprobante.TIPO_COMP_INGRESO+"' OR " +
									"c.comprobante.tipoComprobante = '"+Comprobante.TIPO_COMP_TRASLADO+"'  )" ,
							idConcepto, fechaInicio, fechaFin, fechaInicio, fechaFin);
		} catch (Exception e) {
			log.error("Error en obtener el Importe de comprobantesConcepto: "
					+ e.getMessage());
		}
		return comprobanteConceptolist.size() > 0 ? comprobanteConceptolist
				: null;
	}

	@SuppressWarnings("rawtypes")
	@Override
	@Transactional public Double getSumImportPorCconceptoFecha(Long idConcepto,
			Calendar fechaInicio, Calendar fechaFin) throws DataAccessException {
		Double total = new Double(0);
		try {						
			//DOLLAREMM
			List obj = getHibernateTemplate()
					.find("select sum(c.importe * c.comprobante.tipoDeCambio) from ComprobanteConcepto as " +
							"c where c.concepto.idConcepto=?"
							+ " and ((c.comprobante.numeroParcialidad=0 and c.comprobante.parcialidades=null) or " +
							"c.comprobante.numeroParcialidad=c.comprobante.parcialidades)"
							+  " and (( c.comprobante.fechaTimbrado>?   AND c.comprobante.fechaTimbrado<? )OR" +
							"(c.comprobante.fechaTimbrado is null AND c.comprobante.fechaCreacion>?   " +
							"AND c.comprobante.fechaCreacion<? ))"
							+ " and ( c.comprobante.tipoComprobante = '"+Comprobante.TIPO_COMP_INGRESO+"' " +
									"OR c.comprobante.tipoComprobante = '"+Comprobante.TIPO_COMP_TRASLADO+"'  )" ,
							idConcepto, fechaInicio, fechaFin, fechaInicio, fechaFin);

			if(null != obj.get(0)){
				total = (Double)obj.get(0);
			}
			
		} catch (Exception e) {
			log.error("Error en obtener el Importe de comprobantesConcepto: "
					+ e.getMessage());
		}
		return total;
	}

	@Override
	@Transactional public void save(ComprobanteConcepto comprobanteConcepto) throws DataAccessException {
		getHibernateTemplate().saveOrUpdate(comprobanteConcepto);		
	}

}
